#ifndef snake_H
#define snake_H

#include "ui.h"
#include "snake_data.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>

// 初始蛇头位置
#define init_head_x  10
#define init_head_y  6

// 坐标值转换
#define ANGLE_UP 2700
#define ANGLE_DOWN 900
#define ANGLE_LEFT 1800
#define ANGLE_RIGHT 0

// 蛇身总长度
#define SNAKE_BODY_LEN 100
#define SNAKE_APPLE_MAX 10
#define SNAKE_BOMB_MAX 10


// 蛇尾索引
#define SNAKE_TAIL_INDEX (SNAKE_BODY_LEN-1)

// 方向
#define DIRECTION_UP    0  // 上 = 0
#define DIRECTION_DOWN  1  // 下 = 1
#define DIRECTION_LEFT  2  // 左 = 2
#define DIRECTION_RIGHT 3  // 右 = 3

// 蛇身类型
#define SNAKE_BODY_TYPE1 0  // 蛇身1 直线类型
#define SNAKE_BODY_TYPE2 1  // 蛇身2 转弯类型

// 蛇身对象数组
lv_obj_t * snake_body_arr[SNAKE_BODY_LEN];
lv_obj_t * snake_bomb_arr[SNAKE_BOMB_MAX];
lv_obj_t * snake_apple_arr[SNAKE_APPLE_MAX];

extern int game_score ;
extern int snake_eat_apple_flag ;
extern int rank_init_flag ;


// 贪吃蛇管理结构体
typedef struct snake_head{
    lv_obj_t * snake_head; //蛇头对象
    char snake_head_angle; //蛇头方向

    // 蛇尾对象
    char snake_tail_direction; //蛇尾方向
    int snake_tail_number; //蛇尾编号
    int snake_lastbody_number; //最后一节蛇身编号

    // 蛇身坐标数组
    int snake_length; 
    /*蛇身类型：SNAKE_BODY_TYPE1（直线），SNAKE_BODY_TYPE2（转弯）*/
    char snake_body_type[SNAKE_BODY_LEN]; 
    /*蛇身方向：DIRECTION_UP（上），DIRECTION_DOWN（下），DIRECTION_LEFT（左），DIRECTION_RIGHT（右）*/
    /*BODY2的方向：right下右，left上左，up右上，down左下*/
    char snake_body_direction[SNAKE_BODY_LEN]; //蛇身方向
    int snake_body_x_arr[SNAKE_BODY_LEN];
    int snake_body_y_arr[SNAKE_BODY_LEN];

    // 蛇身管理队列
    /*第一节蛇身为队尾，最后一节蛇身为队首*/
    int snake_body_queue_head;
    int snake_body_queue_tail;
    int snake_body_queue_len;
    int snake_body_queue_arr[SNAKE_BODY_LEN];

    // 炸弹管理数组
    int bomb_quantity;
    int snake_bomb_x_arr[SNAKE_BOMB_MAX];
    int snake_bomb_y_arr[SNAKE_BOMB_MAX];
    // 食物管理数组
    int apple_quantity;
    int snake_apple_x_arr[SNAKE_APPLE_MAX];
    int snake_apple_y_arr[SNAKE_APPLE_MAX];
}snake_head_t , * snake_head_p;

// 碰撞类型
enum collision_type{
    collision_none,
    collision_body,
    collision_bomb,
    collision_apple
};

// 移动方向
enum move_direction{
    move_straight,
    move_turen_left,
    move_turen_right,
    move_back
};



void * lv_mem_alloc(size_t size);
void lv_mem_free(void * ptr);
int xy_to_num(int x);
int direction_to_angle(int direction);
snake_head_p snake_init();
void game_over(snake_head_p* snake_head_ptr);
enum collision_type snake_collision_check(snake_head_p snake_head , int x , int y);
void snake_move(snake_head_p snake_head); // 移动蛇

enum move_direction snake_move_direction_get(snake_head_p snake_head , int x_head , int y_head);
int snake_body_queue_dequeue(snake_head_p snake_head);
void snake_body_queue_enqueue(snake_head_p snake_head , int index);
int snake_body_queue_head_index(snake_head_p snake_head);

void snake_move_direction (snake_head_p snake_head , int x_head , int y_head);
void snake_move_straight(snake_head_p snake_head , int x_head , int y_head);

void snake_move_turen_left(snake_head_p snake_head , int x_head , int y_head);
void snake_move_turen_right(snake_head_p snake_head , int x_head , int y_head);

void snake_head_img_move(snake_head_p snake_head);
void snake_tail_img_move(snake_head_p snake_head);
void snake_body_img_move(snake_head_p snake_head , int indix);
void snake_body_img_move_left(snake_head_p snake_head , int indix);

void snake_eat_apple(snake_head_p snake_head, int x_head ,int y_head);

void apple_create(snake_head_p snake_head);
void apple_move(snake_head_p snake_head);

void rank_init();
void game_save_score();


#endif